package org.dromara.llm.llm.memory;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.llm.domain.SysMessage;
import org.dromara.llm.domain.TtsFlagCode;
import org.dromara.llm.domain.vo.SysMessageVo;
import org.dromara.llm.mapper.SysMessageMapper;
import org.dromara.llm.tts.factory.TtsServiceFactory;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 基于数据库的聊天记忆实现
 */
@Service
@Slf4j
public class DatabaseChatMemory implements ChatMemory {
    @Resource
    private SysMessageMapper messageService;

    @Resource
    private TtsServiceFactory ttsService;

    /**
     * 添加消息
     *
     * @param messageVo 消息
     * @param ttsFlag   语音标志
     * @return 添加结果
     */
    @Override
    public int addMessage(SysMessageVo messageVo, String ttsFlag) {
        SysMessage message = MapstructUtils.convert(messageVo, SysMessage.class);
        try {
            if (message != null && ttsFlag != null && ttsFlag.equals(TtsFlagCode.T.getCode())) {
                message.setAudioPath(ttsService.getDefaultTtsService().textToSpeech(message.getMessage()));
            }
        } catch (Exception e) {
            log.error("保存消息时出错，TTS服务失败: {}", e.getMessage(), e);
        }
        return messageService.insert(message);
    }

    /**
     * 添加消息
     *
     * @param sender      发送者
     * @param content     内容
     * @param messageType 消息类型
     * @param audioPath   音频路径
     * @param loginUser   登录用户
     */
    @Override
    public void addMessage(String sender, String content, String messageType, String audioPath, LoginUser loginUser) {
        try {

            SysMessage message = new SysMessage();
            message.setDeviceId(loginUser.getUserId().toString());
            message.setSessionId(loginUser.getToken());
            message.setSender(sender);
            message.setMessage(content);
            message.setRoleId(loginUser.getRoleId());
            message.setMessageType(messageType);
            if (Objects.equals(sender, "assistant")) {
                // 目前生成的语音保存采用默认的语音合成服务，后续可以考虑支持自定义语音合成服务
                // todo
                message.setAudioPath(ttsService.getDefaultTtsService().textToSpeech(content));
            } else {
                message.setAudioPath(audioPath);
            }
            messageService.insert(message);
        } catch (Exception e) {
            log.error("保存消息时出错: {}", e.getMessage(), e);
        }
    }

    /**
     * 获取历史消息
     *
     * @param deviceId    设备ID
     * @param messageType 消息类型
     * @param limit       限制数量
     * @return 历史消息
     */
    @Override
    public List<SysMessage> getMessages(String deviceId, String messageType, Integer limit) {
        try {
            LambdaQueryWrapper<SysMessage> lqw = Wrappers.lambdaQuery();
            lqw.eq(StringUtils.isNotBlank(deviceId), SysMessage::getDeviceId, deviceId);
            lqw.eq(StringUtils.isNotBlank(messageType), SysMessage::getMessageType, messageType);
            lqw.orderByDesc(SysMessage::getCreateTime);
            lqw.last("limit " + limit);
            return messageService.selectList(lqw);
        } catch (Exception e) {
            log.error("获取历史消息时出错: {}", e.getMessage(), e);
            return new ArrayList<>();
        }
    }
}
